﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "ICommand.h"
#include "GcmpCommandAction.h"

namespace gcmp
{
    /// \brief 命令基类
    ///
    class GCMP_COMMAND_ACTION_EXPORT CommandBase : public ICommand
    {
        CANNOT_COPY_OR_ASSIGN(CommandBase);
    public:
        CommandBase(const std::wstring &commandId, bool hasCommandData = false);

        virtual ~CommandBase();

    public:
        ///  \brief 获取命令Id,程序内唯一
        /// \return 命令Id
        virtual const std::wstring& GetCommandId() const override;

       ///  \brief 命令是否启用
       ///
       /// \return 开启返回true，否则返回false 
        virtual bool IsEnabled() const override;

        ///  \brief 命令是否可见
        ///
        /// \return 可见返回true,否则返回false
        virtual bool IsVisible() const override;
        
        ///  \brief 执行命令
        ///
        /// \param  cmdParams  命令参数
        /// \return 命令需要执行的操作，可以为nullptr
        virtual gcmp::OwnerPtr<gcmp::IAction> ExecuteCommand(const gcmp::CommandParameters& cmdParams) override;

        ///  \brief 命令是否有参数，日志脚本记录时使用，如打开文件命令
        ///
        /// \return 命令有参数返回true，否则返回false
        virtual bool HasCommandData() const override;

        ///  \brief 命令执行前是否需要清除所有的操作，默认是清除所有的操作
        ///
        /// \return 需要清除所有操作返回true,否则返回false
        virtual bool ShouldPopExistingActionsBeforeExecution() const override;

        ///  \brief 命令执行前是否需要清空选择集，默认是不清空选择集
        ///
        /// \return 需要清空选择集返回true,否则返回false
        virtual bool ShouldClearSelectionBeforeExecution() const override;

        ///  \brief 命令执行前是否需要清空弱提示内容，默认是清空弱提示内容
        ///
        /// \return 需要清空清空弱提示内容返回true,否则返回false
        virtual bool ShouldClearNotificationMessagesBeforeExecution() const override;

        /// \brief 命令执行前是否需要强制事务备份处于启用状态，默认是否。
        ///
        /// \return 需要强制开启事务备份返回true，否则返回false。
        virtual bool ShouldEnableTransactionBackupBeforeExecution() const override;

    private:
        OwnerPtr<ICommand> m_commandImpl;
    };
}

